﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SGT_DAL._STG_DALTableAdapters;
using SGT_DAL;

namespace SGT_ON
{
    /// <summary>
    /// Clase utilizada para la presentación y propiedades derivadas.
    /// </summary>
    public partial class StockProducto
    {
        /// <summary>
        /// Se estado tiene que ser Activo|Inactivo
        /// </summary>
        public string EstadoString
        {
            get
            {
                if (EstaActivo == true)
                    return "Activo";
                else
                    return "Eliminado";
            }
            set
            {
                if (value.ToUpper() == "ACTIVO")
                    EstaActivo = true;
                else if (value.ToUpper() == "INACTIVO")
                    EstaActivo = false;
                else
                    throw new ArgumentException("No se ha especificado correctamente EstadoString puede ser: 'Activo'|'Inactivo'");
            }
        }
        public System.Drawing.Color EstadoColor
        {
            get
            {
                if (EstaActivo == false)
                {
                    return System.Drawing.Color.Red;
                }
                else
                {
                    return System.Drawing.Color.Green;
                }
            }
        }
        public bool EstadoPuedeActivar
        {
            get
            {
                if (EstaActivo == false)
                    return true;
                else
                    return false;
            }
        }
        public bool EstadoPuedeInactivar
        {
            get
            {
                if (EstaActivo == false)
                    return false;
                else
                    return true;
            }
        }
        /// <summary>
        /// Devuelve el ID como string
        /// </summary>
        public string CodigoTaller
        {
            get
            {
                return ID.ToString();
            }
        }

        public string PrecioCostoString
        {
            get
            {
                if (PrecioCosto == decimal.Zero)
                    return "";
                return PrecioCosto.ToString(Parametros.FormatoDinero);
            }
            set
            {
                try
                {
                    if (value != "")
                        PrecioCosto = Utilidades.ConvertirADecimal(value);
                }
                catch
                {
                    throw new ArgumentException("El precio costo no es válido");
                }
            }
        }
        public string PrecioVentaString
        {
            get
            {
                if (PrecioVenta == decimal.Zero)
                    return "";
                return PrecioVenta.ToString(Parametros.FormatoDinero);
            }
            set
            {
                try
                {
                    if (value != "")
                        PrecioVenta = Utilidades.ConvertirADecimal(value);
                }
                catch
                {
                    throw new ArgumentException("El precio de venta no es válido");
                }
            }
        }
        public string IVAString
        {
            get
            {
                if (IVA == decimal.Zero)
                    return "N/A";
                else
                {
                    if (IVA == 21)
                        return "21";
                    if (IVA == decimal.Parse("10,5"))
                        return "10,5";
                    return IVA.ToString();
                }
            }
            set
            {
                try
                {
                    if (value != "")
                        IVA = Utilidades.ConvertirADecimal(value);
                }
                catch
                {
                    throw new ArgumentException("El valor de IVA no es válido");
                }
            }
        }
        private string _Responsable;
        public string Responsable
        {
            get
            {
                return _Responsable;
            }
            set
            {
                _Responsable = value;
            }
        }
        public decimal IVAMonto
        {
            get
            {
                if (IVA <= decimal.Zero)
                    return decimal.Zero;
                else
                    return (PrecioVenta * (IVA / 100));
            }
        }
        public string IVAMontoString
        {
            get
            {
                return IVAMonto.ToString(Parametros.FormatoDinero);
            }
        }
        public decimal PrecioVentaConIVA
        {
            get
            {
                return PrecioVenta + IVAMonto;
            }
        }
        public string PrecioVentaConIVAString
        {
            get
            {
                return PrecioVentaConIVA.ToString(Parametros.FormatoDinero);
            }
        }

        /// <summary>
        /// Indica si la cantidad de este producto está por debajo del limite de reposicion.
        /// </summary>
        public Boolean CantidadReposicionConAlarma
        {
            get
            {
                if (CantidadReposicion <= 0)
                    return false;
                if (Cantidad < CantidadReposicion)
                    return true;

                return false;
            }
        }
    }
    /// <summary>
    /// Clase base con la lógica de negocio
    /// </summary>
    [System.ComponentModel.DataObject]
    public partial class StockProducto
    {
        #region Atributos
        protected int _id;
        protected int _CantidadReposicion;
        protected string _CodigoOriginal;
        protected string _Descripcion;
        protected bool _EsComercializable;
        protected bool _EsNuevo;
        protected bool _EstaActivo;
        protected string _FotoURL;
        protected decimal _IVA;
        protected string _Nombre;
        protected decimal _PrecioCosto;
        protected decimal _PrecioVenta;
        protected bool _TieneNumeroDeSerie;
        protected string _TipoDeProducto;
        protected string _Ubicacion;
        protected string _UnidadDeMedida;
        protected string _Marca;
        protected int _Cantidad;


        //Objetos asociados
        #endregion

        #region Propiedades
        public int ID
        {
            get
            {
                return _id;
            }
            set
            {
                _id = value;
            }
        }
        public int CantidadReposicion
        {
            get
            {
                return _CantidadReposicion;
            }
            set
            {
                _CantidadReposicion = value;
            }
        }
        public string CodigoOriginal
        {
            get
            {
                return _CodigoOriginal;
            }
            set
            {
                _CodigoOriginal = value;
            }
        }
        
        public string Descripcion
        {
            get
            {
                return _Descripcion;
            }
            set
            {
                _Descripcion = value;
            }
        }
        public bool EsComercializable
        {
            get
            {
                return _EsComercializable;
            }
            set
            {
                _EsComercializable = value;
            }
        }
        public bool EsNuevo
        {
            get
            {
                return _EsNuevo;
            }
            set
            {
                _EsNuevo = value;
            }
        }
        public bool EstaActivo
        {
            get
            {
                return _EstaActivo;
            }
            set
            {
                _EstaActivo = value;
            }
        }
        public string FotoURL
        {
            get
            {
                return _FotoURL;
            }
            set
            {
                _FotoURL = value;
            }
        }
        public decimal IVA
        {
            get
            {
                return _IVA;
            }
            set
            {
                _IVA = value;
            }
        }
        public string Nombre
        {
            get
            {
                return _Nombre;
            }
            set
            {
                _Nombre = value;
            }
        }
        public decimal PrecioCosto
        {
            get
            {
                return _PrecioCosto;
            }
            set
            {
                _PrecioCosto = value;
            }
        }
        public decimal PrecioVenta
        {
            get
            {
                return _PrecioVenta;
            }
            set
            {
                _PrecioVenta = value;
            }
        }
        public bool TieneNumeroDeSerie
        {
            get
            {
                return _TieneNumeroDeSerie;
            }
            set
            {
                _TieneNumeroDeSerie = value;
            }
        }
        public string TipoDeProducto
        {
            get
            {
                return _TipoDeProducto;
            }
            set
            {
                _TipoDeProducto = value;
            }
        }
        public string Ubicacion
        {
            get
            {
                return _Ubicacion;
            }
            set
            {
                _Ubicacion = value;
            }
        }
        public string UnidadDeMedida
        {
            get
            {
                return _UnidadDeMedida;
            }
            set
            {
                _UnidadDeMedida = value;
            }
        }
        public string Marca
        {
            get
            {
                return _Marca;
            }
            set
            {
                _Marca = value;
            }
        }
        /// <summary>
        /// Si el producto esta marcado como que tiene numero de serie, siempre va a devolver 1 en la cantidad.
        /// </summary>
        public int Cantidad
        {
            get
            {   
                return _Cantidad;
            }
            set
            {
                _Cantidad = value;
            }
        }

        //Objetos asociados

        //Propiedades derivadas
        #endregion

        #region Interfase DAL
        //objeto de la capa DAL
        private static StockProductoTableAdapter _StockProductoAD;
        protected static StockProductoTableAdapter Adaptador
        {
            get
            {
                if (_StockProductoAD == null)
                    _StockProductoAD = new StockProductoTableAdapter();

                return _StockProductoAD;
            }
        }
        protected static StockProducto ObtenerPorID(int pID)
        {
            _STG_DAL.StockProductoDataTable _dt;

            _dt = Adaptador.ObtenerPorId(pID);

            // si tiene algo,
            if (_dt.Rows.Count > 0)
                return AsignarRowAObjeto((_STG_DAL.StockProductoRow)_dt.Rows[0]);

            return null;
        }
        protected static StockProducto AsignarRowAObjeto(_STG_DAL.StockProductoRow pRow)
        {
            StockProducto _StockProducto = new StockProducto();
            if (pRow != null)
            {
                _StockProducto = new StockProducto();
                _StockProducto.ID = pRow.ID;
                _StockProducto.CantidadReposicion = pRow.CantidadDeReposicion;
                _StockProducto.CodigoOriginal = pRow.CodigoOriginal;
                _StockProducto.Descripcion = pRow.Descripcion;
                _StockProducto.EsComercializable = pRow.EsComercializable;
                _StockProducto.EsNuevo = pRow.EsNuevo;
                _StockProducto.EstaActivo = pRow.EstaActivo;
                _StockProducto.FotoURL = pRow.FotoURL;
                _StockProducto.IVA = pRow.IVA;
                _StockProducto.Nombre = pRow.Nombre;
                _StockProducto.PrecioCosto = pRow.PrecioCosto;
                _StockProducto.PrecioVenta = pRow.PrecioVenta;
                _StockProducto.TieneNumeroDeSerie = pRow.TieneNumeroDeSerie;
                _StockProducto.TipoDeProducto = pRow.TipoDeProducto;
                _StockProducto.Ubicacion = pRow.Ubicacion;
                _StockProducto.UnidadDeMedida = pRow.UnidadDeMedida;
                _StockProducto.Marca = pRow.Marca;
                _StockProducto.Cantidad = pRow.Cantidad;

                
            }
            return _StockProducto;
        }
        protected StockProducto Insertar(int pCantidadDeReposicion, string pCodigoOriginal, string pDescripcion, bool pEsComercializable, bool pEsNuevo, bool pEstaActivo, string pFotoURL, decimal pIVA, string pNombre, decimal pPrecioCosto, decimal pPrecioVenta, bool pTieneNumeroDeSerie, string pTipoDeProducto, string pUbicacion, string pUnidadDeMedida, string pMarca,int pCantidad, string pResponsable)
        {
            ID = int.Parse(Adaptador.Insertar(pCantidadDeReposicion, pCodigoOriginal, pDescripcion, pEsComercializable, pEsNuevo, pEstaActivo, pFotoURL, pIVA, pNombre, pPrecioCosto, pPrecioVenta, pTieneNumeroDeSerie, pTipoDeProducto, pUbicacion, pUnidadDeMedida, pMarca, pCantidad).ToString());

            if(pCantidad > 0)
            {
                StockMovimientoStock.GenerarMovimientoDeStock("Alta de producto", pResponsable, pCantidad, ID);
            }

            return this;
        }
        public static bool Actualizar(int pCantidadDeReposicion, string pCodigoOriginal, string pDescripcion, bool pEsComercializable, bool pEsNuevo, bool pEstaActivo, string pFotoURL, decimal pIVA, string pNombre, decimal pPrecioCosto, decimal pPrecioVenta, bool pTieneNumeroDeSerie, string pTipoDeProducto, string pUbicacion, string pUnidadDeMedida, string pMarca,int pCantidad, int pId)
        {
        
            if (0 < Adaptador.Actualizar(pCantidadDeReposicion, pCodigoOriginal, pDescripcion, pEsComercializable, pEsNuevo, pEstaActivo, pFotoURL, pIVA, pNombre, pPrecioCosto, pPrecioVenta, pTieneNumeroDeSerie, pTipoDeProducto, pUbicacion, pUnidadDeMedida, pMarca, pCantidad, pId))
                return true;
            else
                return false;
        }
        public void Eliminar()
        {
            StockProducto _StockProducto = StockProducto.ObtenerPorID(this.ID);
            _StockProducto.EstaActivo = false;
            _StockProducto.Actualizar();
        }
        protected static StockProductoColeccion AsignarStockProductoTableAdapterAStockProductoColeccion(_STG_DAL.StockProductoDataTable pDataTable)
        {
            StockProductoColeccion _StockProductoes = new StockProductoColeccion();
            StockProducto _StockProducto;

            if ((pDataTable != null)
                && (pDataTable.Rows.Count > 0))
            {
                foreach (_STG_DAL.StockProductoRow _row in pDataTable.Rows)
                {
                    _StockProducto = AsignarRowAObjeto(_row);
                    if (_StockProducto != null)
                        _StockProductoes.Add(_StockProducto);
                }
            }
            return _StockProductoes;
        }
        public static StockProductoColeccion ObtenerTodosLosStockProductos()
        {
            return AsignarStockProductoTableAdapterAStockProductoColeccion(Adaptador.ObtenerTodos());
        }
        /// <summary>
        /// Si el valor ingresado es "" o nulo, traigo todos
        /// </summary>
        /// <param name="pTexto"></param>
        /// <returns></returns>
        public static StockProductoColeccion ObtenerPorTexto(string pTexto)
        {
            if ((pTexto == null)
                || (pTexto == ""))
                return AsignarStockProductoTableAdapterAStockProductoColeccion(Adaptador.ObtenerTodos());
            else
            {
                int _id;
                if (int.TryParse(pTexto, out _id) == true)
                {
                    StockProducto _producto = ObtenerPorID(_id);
                    if ((_producto != null)
                        && (_producto.ID > 0))
                    {
                        StockProductoColeccion _resultado = new StockProductoColeccion();
                        _resultado.Add(_producto);
                        return _resultado;
                    }
                }

                return AsignarStockProductoTableAdapterAStockProductoColeccion(Adaptador.ObtenerPorTexto(pTexto));
            }
        }
        public static StockProductoColeccion ObtenerPorTextoParaAgregarAPresupuesto(string pTexto)
        {
            if ((pTexto == null)
                || (pTexto == ""))
                return AsignarStockProductoTableAdapterAStockProductoColeccion(Adaptador.ObtenerTodosParaAgregarEnPresupuesto());
            else
                return AsignarStockProductoTableAdapterAStockProductoColeccion(Adaptador.ObtenerPorTextoParaAgregarEnPresupuesto(pTexto));
        }

        #endregion

        #region Métodos
        public StockProducto()
        {
            AsignarValoresIniciales();
        }

        public void AsignarValoresIniciales()
        {
            _id = -1;
            CantidadReposicion = 0;
            CodigoOriginal = "";
            Descripcion = "";
            EsComercializable = true;
            EsNuevo = true;
            EstaActivo = true;
            FotoURL = "";
            IVA = decimal.Zero;
            Nombre = "";
            PrecioCosto = decimal.Zero;
            PrecioVenta = decimal.Zero;
            TieneNumeroDeSerie = false;
            TipoDeProducto = TiposDeProducto.Repuesto.ToString();
            Ubicacion = "";


        }

        public static StockProducto CrearStockProducto()
        {
            StockProducto _StockProducto = new StockProducto();
            return _StockProducto;
        }
        public static StockProducto CrearStockProducto(int pID)
        {
            StockProducto _StockProducto = ObtenerPorID(pID);
            return _StockProducto;
        }
        public void Actualizar()
        {
            Actualizar(CantidadReposicion, CodigoOriginal, Descripcion, EsComercializable, EsNuevo, EstaActivo, FotoURL, IVA, Nombre, PrecioCosto, PrecioVenta, TieneNumeroDeSerie, TipoDeProducto, Ubicacion, UnidadDeMedida, Marca, Cantidad, ID);
        }
        public StockProducto Insertar()
        {
            return Insertar( CantidadReposicion, CodigoOriginal, Descripcion, EsComercializable, EsNuevo, EstaActivo, FotoURL, IVA, Nombre, PrecioCosto, PrecioVenta, TieneNumeroDeSerie, TipoDeProducto, Ubicacion, UnidadDeMedida, Marca, Cantidad, Responsable);
        }
        #endregion

        #region Metodos para datasource

        public void Actualizar(StockProducto pStockProducto)
        {
            if (pStockProducto != null)
                pStockProducto.Actualizar();
        }
        public StockProducto Insertar(StockProducto pStockProducto)
        {
            if (pStockProducto != null)
                return pStockProducto.Insertar();
            return null;
        }
        public void Eliminar(StockProducto pStockProducto)
        {
            pStockProducto.Eliminar();
        }
        #endregion
    }
    [System.ComponentModel.DataObject]
    public class StockProductoColeccion : System.Collections.CollectionBase
    {
        public void Add(StockProducto pStockProducto)
        {
            this.List.Add(pStockProducto);
        }
        public void AddUnico(StockProducto pStockProducto)
        {
            foreach (StockProducto _StockProducto in this)
                if (pStockProducto.ID == _StockProducto.ID)
                    return;
            this.List.Add(pStockProducto);
        }
        public void Remove(int index)
        {
            if (index <= Count - 1 || index >= 0)
            {
                this.List.RemoveAt(index);
            }
            else
            {
                throw new System.ArgumentException("Fuera de rango", "original");
            }
        }
        public void Remove(StockProducto pStockProducto)
        {
            for (int i = 0; i < this.Count; i++)
            {
                if (this[i].ID == pStockProducto.ID)
                {
                    Remove(i);
                    return;
                }

            }
        }
        public StockProducto this[int index]
        {
            get { return ((StockProducto)(this.List[index])); }
            set { this.List[index] = value; }
        }
        public void ActualizarStockProductoes(StockProductoColeccion pStockProductoes)
        {
            foreach (StockProducto _StockProducto in pStockProductoes)
            {
                _StockProducto.Actualizar();
            }
        }
        public void ActualizarStockProducto(StockProducto pStockProducto)
        {
            pStockProducto.Actualizar();
        }

        #region Metodos de colección

        #endregion
        #region Para datasource
        public void Insertar(StockProducto pStockProducto)
        {
            pStockProducto.Insertar(pStockProducto);
        }
        #endregion
    }
    public enum TiposDeProducto
    {
        Insumo,
        Herramienta,
        Repuesto
    }
}

